home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 14439 / 14439.xpi / chrome / tabber.jar / content / tabber.js < prev    next >
Text File  |  2009-11-12  |  23KB  |  639 lines

  1. /*
  2. <license>
  3.  
  4. Tabberwocky - https://addons.mozilla.org/addon/14439/
  5. Copyright (c) 2009 Frank Yan
  6.  
  7. This file is part of Tabberwocky.
  8.  
  9. Tabberwocky is free software: you can redistribute it and/or modify
  10. it under the terms of the GNU General Public License as published by
  11. the Free Software Foundation, either version 3 of the License, or
  12. (at your option) any later version.
  13.  
  14. Tabberwocky is distributed in the hope that it will be useful,
  15. but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. GNU General Public License for more details.
  18.  
  19. You should have received a copy of the GNU General Public License
  20. along with Tabberwocky.    If not, see <http://www.gnu.org/licenses/>.
  21.  
  22. </license>
  23. */
  24.  
  25.  
  26. var tabberwocky = {
  27.  
  28.  
  29. io : Cc['@mozilla.org/network/io-service;1'].getService(Ci.nsIIOService),
  30.  
  31.  
  32. duplicateTab: function(tab) {
  33.     var temp = gBrowser.mPrefs.getBoolPref("tabberwocky.opentabsrelative");
  34.     gBrowser.mPrefs.setBoolPref("tabberwocky.opentabsrelative", false);
  35.     tabsopenrelative_nextTabShift++;
  36.     var newTab = gBrowser.duplicateTab(tab);
  37.     newTab.removeAttribute("protected");
  38.     gBrowser.moveTabTo(newTab, tab._tPos+1);
  39.     gBrowser.mPrefs.setBoolPref("tabberwocky.opentabsrelative", temp);
  40. },
  41.  
  42.  
  43. copyTabTitle : function() {
  44.     var title = gBrowser.mContextTab.getAttribute('label');
  45.     const clipboard = Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper);    
  46.     clipboard.copyString(title);
  47. },
  48.  
  49.  
  50. _tabClickingOptions: function() {
  51.     gBrowser.mTabContainer.addEventListener("dblclick", function(event) {
  52.         if(!gBrowser.mPrefs.getBoolPref('tabberwocky.doubleclicktoclose')) return;
  53.         if( event.button == 0 && !event.shiftKey && !event.altKey && !event.ctrlKey && !event.metaKey
  54.          && event.target.localName == "tab"
  55.          && event.target.getAttribute("protected") != "true" ) {
  56.             gBrowser.removeTab(event.target);
  57.             event.stopPropagation();
  58.         }
  59.     }, false);
  60.     gBrowser.mTabContainer.addEventListener("mousedown", function(event) {
  61.         if(this.disabled || event.target.disabled)
  62.             return;
  63.         if((gBrowser.mPrefs.getBoolPref("tabberwocky.shiftclicktoduplicate"))
  64.          && event.shiftKey && !event.altKey && !event.ctrlKey && !event.metaKey && event.button == 0
  65.          && event.target.localName == "tab" && event.originalTarget.className != "tab-close-button") {
  66.             tabberwocky.duplicateTab(event.target);
  67.             event.stopPropagation();
  68.         }
  69.         else if((gBrowser.mPrefs.getIntPref("tabberwocky.altclickshortcut") > 0)
  70.          && event.altKey && !event.shiftKey && !event.ctrlKey && !event.metaKey && event.button == 0
  71.          && event.target.localName == "tab" && event.originalTarget.className != "tab-close-button") {
  72.             if((gBrowser.mPrefs.getIntPref("tabberwocky.altclickshortcut") % 2) == 1)
  73.                 tabberwocky.toggleProtected(event.target);
  74.             if(gBrowser.mPrefs.getIntPref("tabberwocky.altclickshortcut") >= 2)
  75.                 tabberwocky.toggleLocked(event.target);
  76.             event.stopPropagation();
  77.         }
  78.         else if(gBrowser.mPrefs.getBoolPref("tabberwocky.selecttabonclick") && event.button == 0
  79.          && event.target.localName == "tab" && event.originalTarget.className != "tab-close-button")
  80.             event.stopPropagation();
  81.     }, true);
  82.     gBrowser.mTabContainer.addEventListener("click", function(event) {
  83.         if(!gBrowser.mPrefs.getBoolPref("tabberwocky.selecttabonclick"))
  84.             return;
  85.         if(this.disabled || event.target.disabled)
  86.             return;
  87.         if(!(event.shiftKey && (gBrowser.mPrefs.getBoolPref("tabberwocky.shiftclicktoduplicate")))
  88.          && !(event.altKey && (gBrowser.mPrefs.getIntPref("tabberwocky.altclickshortcut") > 0))
  89.          && event.target.localName == "tab" && event.originalTarget.className != "tab-close-button"
  90.          && event.target != event.target.parentNode.selectedItem && event.button == 0) {
  91.             function setTab(tab) {
  92.                 try {
  93.                     tab.parentNode._selectNewTab(tab);
  94.                 } catch(e) {}
  95.             }
  96.             setTimeout(setTab, 0, event.target);
  97.         }
  98.     }, false);
  99. },
  100.  
  101.  
  102. openLinkInInvertedTab: function() {
  103.     var prefStr = "browser.tabs.loadInBackground";
  104.     var prefVal = gBrowser.mPrefs.getBoolPref(prefStr);
  105.     gBrowser.mPrefs.setBoolPref(prefStr, !prefVal);
  106.     gContextMenu.openLinkInTab();
  107.     gBrowser.mPrefs.setBoolPref(prefStr, prefVal);
  108. },
  109.  
  110. _openLinkInInvertedTab: function() {
  111.     tabberwocky.openLinkInNewTabLabel = document.getElementById("context-openlinkintab").getAttribute("label");
  112.     document.getElementById("contentAreaContextMenu").addEventListener("popupshowing", function() {
  113.         if(gBrowser.mPrefs.getIntPref("tabberwocky.openlinkininvertedtab") == 0) {
  114.             document.getElementById("context-openlinkintab").setAttribute("label", tabberwocky.openLinkInNewTabLabel);
  115.             document.getElementById("tabberwocky-openlinkininvertedtab").hidden = true;
  116.             return;
  117.         }
  118.         var hidden = document.getElementById("context-openlinkintab").hidden;
  119.         document.getElementById("tabberwocky-openlinkininvertedtab").hidden = hidden;
  120.         if(hidden) return;
  121.         var pref = gBrowser.mPrefs.getBoolPref("browser.tabs.loadInBackground");
  122.         var strings = document.getElementById("bundle_tabber");
  123.         var background = strings.getString("open_link_in_background_tab");
  124.         var foreground = strings.getString("open_link_in_foreground_tab");
  125.         var d = (pref) ? background : foreground;
  126.         var i = (pref) ? foreground : background;
  127.         document.getElementById("context-openlinkintab").setAttribute("label", d);
  128.         document.getElementById("tabberwocky-openlinkininvertedtab").setAttribute("label", i);
  129.     }, false);
  130. },
  131.  
  132.  
  133. // Reference: Focus Last Selected Tab by Mike Hokenson <gozer.org/mozilla/extensions/>
  134.  
  135. _tabClosingOptions: function() {
  136.     getBrowser().tabContainer.addEventListener('TabClose', function(e) {
  137.         if(e.target.getAttribute("selected") != "true") return;
  138.         var pref = gBrowser.mPrefs.getIntPref('tabberwocky.selectonclose');
  139.         if(pref != 1 && pref != 2) return;
  140.         var tab = e.target;
  141.         var tabs = tab.parentNode.childNodes;
  142.         var index = 0;
  143.         var last = 0;
  144.         for(var i = 0; i < tabs.length; i++) {
  145.             var s = tabs[i].getAttribute('lastselected');
  146.             if(s && s > last && tabs[i] != tab) {
  147.                 index = i;
  148.                 last = s;
  149.             }
  150.             if(tabs[i].getAttribute("selected") == "true" && pref == 1)
  151.                 break;
  152.         }
  153.         if(pref == 1) index = (i == 0) ? (tabs.length > 1) ? 1 : 0 : --i;
  154.         tab.parentNode.parentNode.parentNode.parentNode.selectedTab = tabs[index];
  155.     }, false);
  156.  
  157.     getBrowser().tabContainer.addEventListener('TabSelect', function(e) {
  158.         var tab = e.target;
  159.         tab.setAttribute('lastselected', new Date().getTime() + tab._tPos);
  160.     }, false);
  161. },
  162.  
  163.  
  164. // Tab and Tab Bar Attributes
  165.  
  166. listener: null,
  167.  
  168. // see http://developer.mozilla.org/en/Code_snippets/Preferences
  169. prefListener: function(branchName, func) {
  170.     var prefService = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService);
  171.     var branch = prefService.getBranch(branchName);
  172.     branch.QueryInterface(Ci.nsIPrefBranch2);
  173.  
  174.     this.register = function() {
  175.         branch.addObserver("", this, false);
  176.         branch.getChildList("", { }).forEach(function(name) { func(branch, name); });
  177.      };
  178.  
  179.     this.unregister = function() {
  180.         if(branch)
  181.             branch.removeObserver("", this);
  182.     };
  183.  
  184.     this.observe = function(subject, topic, data) {
  185.         if(topic == "nsPref:changed")
  186.             func(branch, data);
  187.     };
  188. },
  189.  
  190. nextGen : Cc["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULAppInfo).version.indexOf("3.5") != 0,
  191.  
  192. _tabBarAttrs: function() {
  193.     if(tabberwocky.nextGen)
  194.         multirow.addPrefListener("browser.tabs.insertRelatedAfterCurrent", function(p) {
  195.             if(gPrefService.getBoolPref(p))
  196.                 gPrefService.setBoolPref("tabberwocky.opentabsrelative", false);
  197.         });
  198.     this.listener = new tabberwocky.prefListener("tabberwocky.",
  199.         function(branch, name) {
  200.             switch (name) {
  201.                 case "opentabsrelative":
  202.                     if(branch.getBoolPref(name) && tabberwocky.nextGen)
  203.                         gBrowser.mPrefs.setBoolPref("browser.tabs.insertRelatedAfterCurrent", false);
  204.                     break;
  205.                 case "newtabbutton":
  206.                     var tb = document.getElementById("content");
  207.                     if(!branch.getBoolPref(name))
  208.                         tb.setAttribute("tabberwocky-hidenewtabbutton", "true");
  209.                     else
  210.                         tb.removeAttribute("tabberwocky-hidenewtabbutton");
  211.                     break;
  212.                 case "highlightunreadtabs":
  213.                     var tb = document.getElementById("content");
  214.                     if(branch.getBoolPref(name))
  215.                         tb.setAttribute("tabberwocky-highlightunread", "true");
  216.                     else
  217.                         tb.removeAttribute("tabberwocky-highlightunread");
  218.                     break;
  219.                 case "tabprogressbar":
  220.                     var tb = document.getElementById("content");
  221.                     var sp = document.getElementById("statusbar-progresspanel");
  222.                     if(branch.getBoolPref(name)) {
  223.                         tb.setAttribute("tabprogressbar", "true");
  224.                         sp.setAttribute("tabprogressbar-hidden", "true");
  225.                     }
  226.                     else {
  227.                             tb.removeAttribute("tabprogressbar");
  228.                             sp.removeAttribute("tabprogressbar-hidden");
  229.                     }
  230.                     break;
  231.                 case "duplicatetabkey":
  232.                     document.getElementById("key_tabberwocky-duplicatetab").setAttribute("disabled", !branch.getBoolPref(name));
  233.                     break;
  234.                 case "protecttabkey":
  235.                     document.getElementById("key_tabberwocky-toggleprotected").setAttribute("disabled", !branch.getBoolPref(name));
  236.                     break;
  237.                 case "locktabkey":
  238.                     document.getElementById("key_tabberwocky-togglelocked").setAttribute("disabled", !branch.getBoolPref(name));
  239.                     break;
  240.             }
  241.         }
  242.     );
  243.     this.listener.register();
  244.     window.addEventListener("unload", function() {
  245.         tabberwocky.listener.unregister();
  246.     }, false);
  247.     setTimeout( function() {
  248.         gBrowser.selectedTab.setAttribute('lastselected', new Date().getTime() + gBrowser.selectedTab._tPos);
  249.     }, 0);
  250. },
  251.  
  252.  
  253. // Open Selected Links
  254. // References:
  255. // Tree Style Tab by Piro (piro_or) <addons.mozilla.org/addon/5890>
  256. // Link Bookmarklets <https://www.squarefree.com/bookmarklets/pagelinks.html#open_selected_links>
  257.  
  258. openSelectedLinks : function(aFrame) {
  259.     aFrame = this.getCurrentFrame(aFrame);
  260.     var links = this.getSelectedLinks(aFrame);
  261.     if(!links.length) return;
  262.     links.forEach(function(aLink, aIndex) {
  263.         var tab = gBrowser.addTab(aLink.href, this.io.newURI(aFrame.location.href, null, null));
  264.         if(aIndex == 0 && !gBrowser.mPrefs.getBoolPref('browser.tabs.loadInBackground'))
  265.             gBrowser.selectedTab = tab;
  266.     }, this);
  267. },
  268.  
  269. getCurrentFrame : function(aFrame) {
  270.     if(aFrame) return aFrame;
  271.     var targetWindow = document.commandDispatcher.focusedWindow;
  272.     if(!targetWindow || targetWindow.top == window)
  273.         targetWindow = gBrowser.contentWindow;
  274.     return targetWindow;
  275. },
  276.  
  277. getSelectedLinks : function(aFrame) {
  278.     aFrame = this.getCurrentFrame(aFrame);
  279.  
  280.     var links = [];
  281.  
  282.     var selection = aFrame.getSelection();
  283.     if(!selection || !selection.containsNode) return links;
  284.  
  285.     var docLinks = aFrame.document.links;
  286.     if(!docLinks) return links;
  287.     for(var i = 0; i < docLinks.length; i++) {
  288.         if(selection.containsNode(docLinks[i], true) && this.isSafeLink(docLinks[i].href))
  289.             links = links.concat(docLinks[i]);
  290.     }
  291.  
  292.     return links;
  293. },
  294.  
  295. isSafeLink : function(url) {
  296.     if(url.substr(0,7) == 'mailto:') return false;
  297.     if(url.substr(0,11) == 'javascript:') return false;
  298.     return true;
  299. },
  300.  
  301. _openSelectedLinks : function() {
  302.     document.getElementById('contentAreaContextMenu').addEventListener('popupshowing', function() {
  303.         var item = document.getElementById('tabberwocky-openselectedlinks');
  304.         var hbar = document.getElementById('tabberwocky-openselectedlinks-separator');
  305.         if(gBrowser.mPrefs.getBoolPref('tabberwocky.openselectedlinks') && tabberwocky.getSelectedLinks().length) {
  306.             var links = tabberwocky.getSelectedLinks();
  307.             var label = item.getAttribute('label').split(' (')[0] + ' (' + links.length + ')';
  308.             item.setAttribute('label', label);
  309.             var box = document.getElementById('tabberwocky-selectedlinks-box');
  310.             while(box.firstChild)
  311.                 box.removeChild(box.firstChild);
  312.             links.forEach(function(url, i, l) {
  313.                 if(i + 1 != l.length && l.length > 20 && box.childNodes.length > 17) {
  314.                     if(box.childNodes.length == 18) url = '...';
  315.                     else return;
  316.                 }
  317.                 var line = document.createElement('description');
  318.                 line.setAttribute('crop', 'end');
  319.                 line.setAttribute('value', url);
  320.                 box.appendChild(line);
  321.             });
  322.             item.removeAttribute('hidden');
  323.             hbar.removeAttribute('hidden');
  324.         }
  325.         else {
  326.             item.setAttribute('hidden', 'true');
  327.             hbar.setAttribute('hidden', 'true');
  328.         }
  329.     }, false);
  330. },
  331.  
  332.  
  333. // Protected Tabs and Locked Tabs
  334. // References:
  335. // Tab Kit by John Mellor (Jomel) <addons.mozilla.org/addon/5447>
  336. // Tabloc by asukaze <http://www.asukaze.net/soft/tabloc/>
  337.  
  338. toggleProtected : function(tab) {
  339.     if(!tab) tab = gBrowser.selectedTab;
  340.     if(tab.getAttribute("protected") == "true")
  341.         tab.removeAttribute("protected");
  342.     else
  343.         tab.setAttribute("protected", "true");
  344. },
  345.  
  346. toggleLocked : function(tab) {
  347.     if(!tab) tab = gBrowser.selectedTab;
  348.     if(tab.getAttribute("locked") == "true") {
  349.         tab.removeAttribute("locked");
  350.         tabberwocky.restore_loadURI(gBrowser.getBrowserForTab(tab));
  351.     }
  352.     else {
  353.         tab.setAttribute("locked", "true");
  354.         tabberwocky.override_loadURI(gBrowser.getBrowserForTab(tab));
  355.     }
  356. },
  357.  
  358. override_loadURI : function(browser) {
  359.     tabberwocky.restore_loadURI(browser);
  360.  
  361.     browser.addEventListener("click", tabberwocky.lockedClick, true);
  362.  
  363.     return;
  364.  
  365.     if(!browser._tabber_loadURI) {
  366.         browser._tabber_loadURI = browser.loadURI;
  367.         tkLib.prependMethodCode("browser.loadURI", " \
  368.             if(gBrowser.selectedTab.hasAttribute('locked')) { \
  369.                 gBrowser.selectedTab = gBrowser.addTab(aURI, aReferrerURI, aCharset); \
  370.                 return; \
  371.             }");
  372.     }
  373.     if(!browser._tabber_loadURIWithFlags) {
  374.         browser._tabber_loadURIWithFlags = browser.loadURIWithFlags;
  375.         tkLib.prependMethodCode("browser.loadURIWithFlags", " \
  376.             if(gBrowser.selectedTab.hasAttribute('locked')) { \
  377.                 gBrowser.selectedTab = gBrowser.addTab(aURI, aReferrerURI, aCharset); \
  378.                 return; \
  379.             }");
  380.     }
  381. },
  382.  
  383. restore_loadURI : function(browser) {
  384.     try {
  385.         if(browser._tabber_loadURI) {
  386.             browser.loadURI = browser._tabber_loadURI;
  387.             delete browser._tabber_loadURI;
  388.         }
  389.         if(browser._tabber_loadURIWithFlags) {
  390.             browser.loadURIWithFlags = browser._tabber_loadURIWithFlags;
  391.             delete browser._tabber_loadURIWithFlags;
  392.         }
  393.         browser.removeEventListener("click", tabberwocky.lockedClick, true);
  394.     } catch(e) {}
  395. },
  396.  
  397. lockedClick : function(event) {
  398.     if(event && event.target && event.button == 0) {
  399.         var a = event.target;
  400.         while(a && !a.href && a.tagName && (a.tagName.toLowerCase() != "form"))
  401.             a = a.parentNode;
  402.  
  403.         if(a && a.href)
  404.             tabberwocky.lockedHref(a, event);
  405.         else if(a && a.tagName && a.tagName.toLowerCase() === "form")
  406.             tabberwocky.lockedForm(a, event);
  407.     }
  408. },
  409.  
  410. lockedHref : function(a, event) {
  411.     if(event.ctrlKey || event.shiftKey || event.metaKey || event.altKey)
  412.         return;
  413.     if(!gBrowser)
  414.         tkLib.beep();
  415.     else {
  416.         var targethref = tabberwocky.getTargetURL(a).split("#")[0];
  417.         if(a.href === targethref || a.href.indexOf(targethref + "#") == 0) return;
  418.         if(a.href.indexOf("javascript:") == 0) return;
  419.         gBrowser.selectedTab = gBrowser.addTab(a.href, this.io.newURI(a.ownerDocument.URL, null, null));
  420.     }
  421.  
  422.     event.stopPropagation();
  423.     event.preventDefault();
  424. },
  425.  
  426. getTargetURL : function(a) {
  427.     var target = a.target;
  428.     if(target == null || target == "" || target == "_self")
  429.         return ""; // avoid reloading page
  430.     else if(target == "_blank")
  431.         return "";
  432.     else if(target == "_top")
  433.         return gBrowser.currentURI.spec;
  434.     else {
  435.         var frames = gBrowser.contentWindow.frames;
  436.         for(var i=0; i<frames.length; i++) {
  437.             if(frames[i].name == target)
  438.                 return frames[i].document.location.href;
  439.         }
  440.     }
  441.     return a.ownerDocument.URL;
  442. },
  443.  
  444. lockedForm : function(a, event) {
  445.     a.setAttribute("_lock", a.target);
  446.     a.target = "_blank";
  447.     a.ownerDocument.defaultView.setTimeout(tabberwocky.unlockForm, 500, a);
  448. },
  449.  
  450. unlockForm : function(a) {
  451.     if(a.hasAttribute("_lock")) {
  452.         a.target = a.getAttribute("_lock");
  453.         a.removeAttribute("_lock");
  454.     }
  455. },
  456.  
  457. protectedTabClick : function(event) {
  458.     if(event.originalTarget.className == "tab-close-button"
  459.      && (event.button == 0 || event.button == 1)
  460.      && event.target.localName == "tab"
  461.      && event.target.getAttribute("protected") == "true")
  462.     {
  463.         event.target.removeAttribute("protected");
  464.         event.stopPropagation();
  465.     }
  466. },
  467.  
  468. ssTabRestored : function(event) {
  469.     var tab = event.target;
  470.     if(tab.getAttribute("locked") == "true")
  471.         tabberwocky.override_loadURI(gBrowser.getBrowserForTab(tab));
  472. },
  473.  
  474. _protectAndLockTab : function() {
  475.     // persist protected and locked attributes across sessions
  476.     if("@mozilla.org/browser/sessionstore;1" in Cc) {
  477.         var _ss = Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore);
  478.         _ss.persistTabAttribute("protected");
  479.         _ss.persistTabAttribute("locked");
  480.     }
  481.  
  482.     // initialize protected tabs
  483.  
  484.     tkLib.prependMethodCode('gBrowser.removeTab', 'if(aTab.getAttribute("protected") == "true") { tkLib.beep(); return; }');
  485.  
  486.     tkLib.prependMethodCode('gBrowser.warnAboutClosingTabs', ' \
  487.         if(aAll === true) { \
  488.             var numProtected = this.mTabContainer.getElementsByAttribute("protected", "true").length; \
  489.             if(numProtected > 0) \
  490.                 return tkLib.warnAboutClosingProtectedTabs(numProtected); \
  491.         } \
  492.     ');
  493.  
  494.     gBrowser.mTabContainer.addEventListener("click", tabberwocky.protectedTabClick, true);
  495.  
  496.     // initialize locked tabs
  497.  
  498.     gBrowser.tabContainer.addEventListener("SSTabRestored", tabberwocky.ssTabRestored, false);
  499.  
  500.     setTimeout(function() {
  501.         var _tabs = gBrowser.mTabs;
  502.         for(var i = 0; i < _tabs.length; i++) {
  503.             if(_tabs[i].getAttribute("locked") == "true")
  504.                 tabberwocky.override_loadURI(gBrowser.getBrowserForTab(_tabs[i]));
  505.         }
  506.     }, 500);
  507. },
  508.  
  509.  
  510. copyTabHistory : function(fromTab, toTab) {
  511.     if(!gBrowser.mPrefs.getBoolPref('tabberwocky.tabhistory')) return;
  512.     var from = getBrowser().getBrowserForTab(fromTab).sessionHistory;
  513.     var to = getBrowser().getBrowserForTab(toTab).sessionHistory;
  514.     to.QueryInterface(Ci.nsISHistoryInternal);
  515.     for(var i = 0; i <= from.index; i++)
  516.         to.addEntry(from.getEntryAtIndex(i, false), true);
  517. },
  518.  
  519. _copyTabHistory : function() {
  520.     eval("nsBrowserAccess.prototype.openURI = " + nsBrowserAccess.prototype.openURI.toString().replace(
  521.         /(var newTab [^;]+;)/, "$1\nif(newTab.owner) tabberwocky.copyTabHistory(newTab.owner, newTab);\n"));
  522.     eval("gBrowser.addTab = " + gBrowser.addTab.toString().replace("t.linkedBrowser = b;", "$&\n \
  523.         if(!b.sessionHistory.count && aReferrerURI && aReferrerURI.scheme != 'chrome') \
  524.         tabberwocky.copyTabHistory(this.mCurrentTab, t);\n"));
  525. },
  526.  
  527.  
  528. _openURLBarInTab : function() {
  529.     tkLib.addMethodHook([
  530.         'gURLBar.handleCommand',
  531.         null,
  532.         'aTriggeringEvent.altKey',
  533.         '(aTriggeringEvent.altKey ^ gPrefService.getBoolPref("tabberwocky.opentabsfromurlbar")) \
  534.     && (gBrowser.currentURI.spec != "about:blank" || gBrowser.webProgress.isLoadingDocument) \
  535.     && (url.indexOf("javascript:") != 0)'
  536.     ]);
  537.  
  538.     document.getElementById("PopupAutoCompleteRichResult").onPopupClick = function(aEvent) {
  539.  
  540.         if(aEvent.button == 2) return;
  541.  
  542.         var controller = this.view.QueryInterface(Ci.nsIAutoCompleteController), url = "";
  543.         try {
  544.             url = controller.getValueAt(this.selectedIndex);
  545.         } catch(e) {}
  546.  
  547.         if((gPrefService.getBoolPref("tabberwocky.opentabsfromurlbar") && (aEvent.button == 1 || aEvent.ctrlKey || aEvent.metaKey))
  548.          || (gBrowser.currentURI.spec == "about:blank" && !gBrowser.webProgress.isLoadingDocument)
  549.          || url.indexOf("javascript:") == 0) {
  550.             controller.handleEnter(true);
  551.             return;
  552.         }
  553.  
  554.         if(aEvent.button == 0 && !aEvent.shiftKey && !aEvent.ctrlKey && !aEvent.altKey && !aEvent.metaKey) {
  555.             if(gPrefService.getBoolPref("tabberwocky.opentabsfromurlbar") && gURLBar && this.mInput == gURLBar) {
  556.                 this.closePopup();
  557.                 controller.handleEscape();
  558.                 gBrowser.selectedTab = gBrowser.addTab(url);
  559.             }
  560.             else controller.handleEnter(true);
  561.             return;
  562.         }
  563.  
  564.         if(gURLBar && this.mInput == gURLBar) {
  565.             this.closePopup();
  566.             controller.handleEscape();
  567.             openUILink(url, aEvent);
  568.         }
  569.  
  570.     };
  571.  
  572.     tkLib.addMethodHook([
  573.         'BrowserSearch.loadSearch',
  574.         null,
  575.         '(useNewTab)',
  576.         '(useNewTab && (gBrowser.currentURI.spec != "about:blank" || gBrowser.webProgress.isLoadingDocument))'
  577.     ]);
  578.  
  579.     tkLib.prependMethodCode('BrowserSearch.searchBar.doSearch',
  580.         'if (gBrowser.currentURI.spec == "about:blank" && !gBrowser.webProgress.isLoadingDocument) aWhere = "current";'
  581.     );
  582. },
  583.  
  584.  
  585. _tabContextMenu : function() {
  586.     function $(id) { return document.getElementById(id); }
  587.     var tabContextMenu = gBrowser.mStrip.getElementsByAttribute("anonid", "tabContextMenu")[0];
  588.     tabContextMenu.insertBefore($("tabberwocky-duplicatetab"), $("context_newTab").nextSibling);
  589.     tabContextMenu.insertBefore($("tabberwocky-toggleprotected"), $("context_reloadTab"));
  590.     tabContextMenu.insertBefore($("tabberwocky-togglelocked"), $("context_reloadTab"));
  591.     tabContextMenu.insertBefore($("tabberwocky-copytabtitle"), $("context_bookmarkAllTabs").nextSibling);
  592.     tabContextMenu.addEventListener("popupshowing", function() {
  593.         if(gBrowser.mPrefs.getBoolPref("tabberwocky.duplicatetab"))
  594.             document.getElementById("tabberwocky-duplicatetab").removeAttribute("hidden");
  595.         else
  596.             document.getElementById("tabberwocky-duplicatetab").setAttribute("hidden", "true");
  597.  
  598.         var tab = gBrowser.mContextTab || gBrowser.selectedTab;
  599.         var isProtected = tab.getAttribute("protected") == "true";
  600.         document.getElementById("context_closeTab").setAttribute('disabled', isProtected);
  601.         if(!gBrowser.mPrefs.getBoolPref("tabberwocky.protecttab"))
  602.             document.getElementById("tabberwocky-toggleprotected").setAttribute("hidden", "true");
  603.         else {
  604.             document.getElementById("tabberwocky-toggleprotected").removeAttribute("hidden");
  605.             document.getElementById("tabberwocky-toggleprotected").setAttribute("checked", isProtected);
  606.         }
  607.         if(!gBrowser.mPrefs.getBoolPref("tabberwocky.locktab"))
  608.             document.getElementById("tabberwocky-togglelocked").setAttribute("hidden", "true");
  609.         else {
  610.             document.getElementById("tabberwocky-togglelocked").removeAttribute("hidden");
  611.             var isLocked = tab.getAttribute("locked") == "true";
  612.             document.getElementById("tabberwocky-togglelocked").setAttribute("checked", isLocked);
  613.         }
  614.  
  615.         if(gBrowser.mPrefs.getBoolPref("tabberwocky.copytabtitle"))
  616.             document.getElementById("tabberwocky-copytabtitle").removeAttribute("hidden");
  617.         else
  618.             document.getElementById("tabberwocky-copytabtitle").setAttribute("hidden", "true");
  619.     }, false);
  620. },
  621.  
  622.  
  623. voila: function() {
  624.     tabberwocky._tabClickingOptions();
  625.     tabberwocky._openLinkInInvertedTab();
  626.     tabberwocky._tabClosingOptions();
  627.     tabberwocky._tabBarAttrs();
  628.     tabberwocky._openSelectedLinks();
  629.     tabberwocky._protectAndLockTab();
  630.     tabberwocky._copyTabHistory();
  631.     tabberwocky._openURLBarInTab();
  632.     tabberwocky._tabContextMenu();
  633. }
  634.  
  635.  
  636. }
  637.  
  638.  
  639. window.addEventListener("load", tabberwocky.voila, false);